﻿//using System;
//using System.Collections.Generic;
//using System.Text;
//using ZhCun.Framework.Common.Models;
//using System.Collections;

//namespace ZhCun.Framework.DataAccess.WhereParams
//{
//    /// <summary>
//    /// 此类定义了将DbWhereModel条件查询对象解析成DAL所需参数的操作,
//    /// 由于每个数据库对象可能在where查询中存在差异,所以每种数据库要对应所需方法
//    /// </summary>
//    public class WhereParamBase
//    {
//        #region 获得where查询数据参数的方法
//        /// <summary>
//        /// 根据比较枚举获得比较符 "=",">"等 
//        /// </summary>
//        protected virtual string GetCompareSignStr(CompareSignEnum compare)
//        {
//            switch (compare)
//            {
//                case CompareSignEnum.EqualTo:
//                    return "=";
//                case CompareSignEnum.GreaterThan:
//                    return ">";
//                case CompareSignEnum.GreaterThanOrEqual:
//                    return ">=";
//                case CompareSignEnum.LessThan:
//                    return "<";
//                case CompareSignEnum.LessThanOrEqual:
//                    return "<=";
//                case CompareSignEnum.NotEqualTo:
//                    return "<>";
//                case CompareSignEnum.In:
//                    return "in";
//                case CompareSignEnum.NotIn:
//                    return "not in";
//                case CompareSignEnum.LikeLeft:
//                case CompareSignEnum.LikeRight:
//                case CompareSignEnum.LikeFull:
//                    return "like";
//                case CompareSignEnum.NotLikeFull:
//                case CompareSignEnum.NotLikeLeft:
//                case CompareSignEnum.NotLikeRight:
//                    return "not like";
//                default:
//                    throw new Exception("操作符未定义解析,请在指定解析符号添加所解析类型!");
//            }
//        }
//        /// <summary>
//        /// 根据连接符枚举获得连接符(and,or)
//        /// </summary>
//        protected virtual string GetConnectorSign(ConnectorSignEnum connector)
//        {
//            switch (connector)
//            {
//                case ConnectorSignEnum.And:
//                    return "and";
//                case ConnectorSignEnum.Or:
//                    return "or";
//                default:
//                    return "and";
//            }
//        }
//        /// <summary>
//        /// 根据参数实体,获得where条件及参数值对象(主方法),
//        /// 连接符(and or )不生成,由其它重载方法实现
//        /// </summary>
//        public virtual void GetSqlWhereParam(DbWhereModel whereModel, ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict)
//        {
//            #region 判断参数并处理
//            if (whereModel == null)
//            {
//                throw new Exception("获得参数时出错,传入whereModel为Null,在 DbParamsHelper类中.");
//            }
//            if (whereModel.FieldName == null)
//            {
//                throw new Exception("获得参数时出错,传入whereModel中字段为Null,在 DbParamsHelper类中.");
//            }
//            if (sqlWhere == null)
//            {
//                sqlWhere = new StringBuilder();
//            }
//            if (paramDict == null)
//            {
//                paramDict = new Dictionary<string, object>();
//            }

//            #endregion
//            #region 获得比较符 > < = 等

//            string cStr = GetCompareSignStr(whereModel.CompareSign);

//            #endregion
//            #region 获得参数名,如果有重复字段则加入标识符

//            string paramName = "@" + whereModel.FieldName;
//            int paramIndex = 0; //参数名重复加上标识,防止冲突
//            while (true)
//            {
//                //如果参数名存在,则区别于之前参数
//                if (paramDict.ContainsKey(paramName))
//                {
//                    paramName += paramIndex;
//                    paramIndex++;
//                }
//                else
//                {
//                    break;
//                }
//            }

//            #endregion 获得参数名 【结束】
//            #region 添加连接符,and,or (此方法注释掉,由其它重载方法(GetSqlWhereParam)实现与添加)

//            //string sqlWhereStr = sqlWhere.ToString().Trim();
//            //if (sqlWhereStr.Length >= 3 && (sqlWhereStr.Substring(1, 3).ToLower() != "and"
//            //    || sqlWhereStr.Substring(1, 2).ToLower() != "or"))
//            //{
//            //    //如果sqlWhere条件存在内容,则加入连接符
//            //    string connectorSign = GetConnectorSign(whereModel.ConnectorSign);
//            //    sqlWhere.AppendFormat(" {0} ", connectorSign);
//            //}
//            #endregion 添加连接符,and,or 【结束】
//            #region 添加比较操作语句 a>b, a<=b 等

//            //是否往字典表添加参数与值 ,not in ,in 时不添加参数值
//            bool isAddDict = true;
//            switch (whereModel.CompareSign)
//            {
//                case CompareSignEnum.EqualTo:
//                case CompareSignEnum.NotEqualTo:
//                case CompareSignEnum.GreaterThan:
//                case CompareSignEnum.GreaterThanOrEqual:
//                case CompareSignEnum.LessThan:
//                case CompareSignEnum.LessThanOrEqual:
//                    sqlWhere.AppendFormat(" {0}{1}{2} ", whereModel.FieldName, cStr, paramName);
//                    break;
//                case CompareSignEnum.In:
//                case CompareSignEnum.NotIn:
//                    if (whereModel.ParamValue == null || whereModel.ParamValue.ToString().Trim() == string.Empty)
//                    {
//                        throw new Exception("当比较符是In 或 Not In 时,参数值不能Null或Empty");
//                    }
//                    sqlWhere.AppendFormat(" {0} {1} ({2}) ", whereModel.FieldName, cStr, whereModel.ParamValue);
//                    isAddDict = false;
//                    break;
//                case CompareSignEnum.LikeLeft:
//                    sqlWhere.AppendFormat(" {0} {1} {2} ", whereModel.FieldName, cStr, paramName);
//                    whereModel.ParamValue = string.Format("%{0}", whereModel.ParamValue);
//                    break;
//                case CompareSignEnum.LikeRight:
//                    sqlWhere.AppendFormat(" {0} {1} {2} ", whereModel.FieldName, cStr, paramName);
//                    whereModel.ParamValue = string.Format("{0}%", whereModel.ParamValue);
//                    break;
//                case CompareSignEnum.LikeFull:
//                    sqlWhere.AppendFormat(" [{0}] {1} {2} ", whereModel.FieldName, cStr, paramName);
//                    whereModel.ParamValue = string.Format("%{0}%", whereModel.ParamValue);
//                    break;
//                default:
//                    sqlWhere.Append(" 1=1 ");
//                    isAddDict = false;
//                    break;
//            }
//            #endregion 添加比较操作语句 a>b, a<=b 等 【结束】
//            #region 添加到参数字典

//            if (isAddDict)
//            {
//                paramDict.Add(paramName, whereModel.ParamValue);
//            }
//            #endregion
//        }
//        /// <summary>
//        /// 根据一个whereModel集合来获得where条件,如果whereModel包含多条则会将用括号引住
//        /// </summary>
//        public virtual void GetSqlWhereParam(ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict, params DbWhereModel[] whereModel)
//        {
//            if (sqlWhere == null) sqlWhere = new StringBuilder();
//            if (whereModel == null || whereModel.Length == 0)
//            {
//                return;
//            }
//            if (whereModel[0] == null) return;
//            string connSign = GetConnectorSign(whereModel[0].ConnectorSign);
//            if (sqlWhere.Length >= 3)
//            {
//                //如果where条件已存在其它语句,则加入连接符(and,or)
//                sqlWhere.AppendFormat(" {0} ", connSign);
//            }
//            if (whereModel.Length > 1)
//            {
//                sqlWhere.Append("(");
//                GetSqlWhereParam(whereModel[0], ref sqlWhere, ref paramDict);
//                for (int i = 1; i < whereModel.Length; i++)
//                {
//                    connSign = GetConnectorSign(whereModel[i].ConnectorSign);
//                    sqlWhere.AppendFormat(" {0} ", connSign);
//                    GetSqlWhereParam(whereModel[i], ref sqlWhere, ref paramDict);
//                }
//                sqlWhere.Append(")");
//            }
//            else
//            {
//                GetSqlWhereParam(whereModel[0], ref sqlWhere, ref paramDict);
//            }
//        }

//        public virtual void GetSqlWhereParam(ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict, params DbWhereModel[][] whereModel)
//        {
//            if (sqlWhere == null) sqlWhere = new StringBuilder();
//            if (whereModel == null || whereModel.Length == 0) return;
//            if (whereModel.Length == 1)
//            {
//                GetSqlWhereParam(ref sqlWhere, ref paramDict, whereModel[0]);
//                return;
//            } string connSign;
//            if (sqlWhere.Length > 3)
//            {
//                connSign = GetConnectorSign(whereModel[0][0].ConnectorSign);
//                sqlWhere.AppendFormat(" {0} ", connSign);
//            }
//            sqlWhere.Append("(");
//            GetSqlWhereParam(ref sqlWhere, ref paramDict, whereModel[0]);
//            for (int i = 1; i < whereModel.Length; i++)
//            {
//                if (whereModel[i] == null || whereModel[i].Length == 0) continue;
//                for (int j = 0; j < whereModel[i].Length; j++)
//                {
//                    GetSqlWhereParam(ref sqlWhere, ref paramDict, whereModel[i]);
//                }
//            }
//            sqlWhere.Append(")");
//        }

//        #endregion

//        class WhereParamTree
//        {
//            public int CId { set; get; }
//            public int PId { set; get; }
//            public string WhereParamObj { set; get; }
//        }

//        void Test(params WhereParamBase[] wp)
//        {
//            WhereParamTree wpt = new WhereParamTree();
//            wpt.CId = 1;
//            wpt.PId = 0;
//            wpt.WhereParamObj = "name = '张三'";
//            wpt.CId = 2;
//            wpt.PId = 0;
//            wpt.WhereParamObj = "Age=18";
//            wpt.CId = 3;
//            wpt.PId = 2;
//            wpt.WhereParamObj = " or Age = 17";

//            foreach (WhereParamBase item in wp)
//            {

//            }
//            int[,] arr1 = new int[2, 2];
//            arr1[1, 1] = 1;


//        }
//        void Test()
//        {
//            WhereParamBase wp1 = new WhereParamBase();
//            WhereParamBase[,] wp2 = new WhereParamBase[,] { { wp1 } };
//            Test(wp1);
//        }
//        //#region WhereMoelTree

//        //public virtual void GetSqlWhereParam(ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict, DbWhereModelTree whereTree)
//        //{
//        //    if (sqlWhere == null) sqlWhere = new StringBuilder();
//        //    if (paramDict == null) paramDict = new Dictionary<string, object>();
//        //    string connSign = GetConnectorSign(whereTree.WhereObj.ConnectorSign);
//        //    if (sqlWhere.Length >= 3)
//        //    {
//        //        //如果where条件已存在其它语句,则加入连接符(and,or)
//        //        sqlWhere.AppendFormat(" {0} ", connSign);
//        //    }
//        //    sqlWhere.Append(" ( ");

//        //    GetSqlWhereParam(whereTree.WhereObj, ref sqlWhere, ref paramDict);

//        //    List<DbWhereModel> list1 = GetSubWhereTree(whereTree);
//        //    if (list1 != null)
//        //    {
//        //        GetSqlWhereParam(ref sqlWhere, ref paramDict, list1.ToArray());
//        //    }

//        //    GetSubWhereTree(ref sqlWhere, ref paramDict, whereTree);

//        //    sqlWhere.Append(" ) ");
//        //}

//        //void GetSub(ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict, DbWhereModelTree whereTree)
//        //{
//        //    if (whereTree.WhereList != null)
//        //    {
//        //        foreach (var item in whereTree.WhereList)
//        //        {
//        //            if (item.WhereList == null)
//        //            {
//        //                List<DbWhereModel> list = GetSubWhereTree(item);
//        //                if (list != null)
//        //                {
//        //                    StringBuilder subSqlWhere = new StringBuilder();
//        //                    sqlWhere.Append(" and ");
//        //                    GetSqlWhereParam(ref subSqlWhere, ref paramDict, list.ToArray());
//        //                }
//        //            }
//        //            else
//        //            {
//        //                GetSub(ref sqlWhere, ref paramDict, item);
//        //            }

//        //            //string con = GetConnectorSign(whereTree.WhereObj.ConnectorSign);
//        //            //sqlWhere.AppendFormat(" {0} ", con);
//        //            //sqlWhere.AppendFormat(" ( ");
//        //            //List<DbWhereModel> list = GetSubWhereTree(item);
//        //            //if (list != null)
//        //            //{
//        //            //    GetSqlWhereParam(ref sqlWhere, ref paramDict, list.ToArray());
//        //            //}


//        //            //GetSqlWhereParam(whereTree.WhereObj, ref sqlWhere, ref paramDict);


//        //            //sqlWhere.AppendFormat(" ) ");
//        //        }
//        //    }
//        //    else
//        //    { 

//        //    }
//        //}

//        //public virtual void GetSubWhereTree(ref StringBuilder sqlWhere, ref Dictionary<string, object> paramDict, DbWhereModelTree whereTree)
//        //{
//        //    foreach (DbWhereModelTree item in whereTree.WhereList)
//        //    {
//        //        if (item.WhereList != null)
//        //        {
//        //            List<DbWhereModel> list = GetSubWhereTree(item);
//        //            if (list != null)
//        //            {
//        //                StringBuilder subSqlWhere = new StringBuilder();
//        //                GetSqlWhereParam(ref subSqlWhere, ref paramDict, list.ToArray());
//        //                sqlWhere.Append(subSqlWhere);
//        //            }

//        //            GetSubWhereTree(ref sqlWhere, ref paramDict, item);
//        //        }
//        //    }

//        //}

//        //List<DbWhereModel> GetSubWhereTree(DbWhereModelTree whereTree)
//        //{
//        //    if (whereTree.WhereList == null || whereTree.WhereList.Count == 0) return null;
//        //    List<DbWhereModel> list = new List<DbWhereModel>();
//        //    foreach (DbWhereModelTree item in whereTree.WhereList)
//        //    {
//        //        list.Add(item.WhereObj);
//        //    }
//        //    return list;
//        //}

//        //DbWhereModel[] GetRootWhere(DbWhereModelTree whereTree)
//        //{
//        //    List<DbWhereModel> list = null;
//        //    foreach (DbWhereModelTree item in whereTree.WhereList)
//        //    {
//        //        if (item.PId == Guid.Empty)
//        //        {
//        //            list.Add(item.WhereObj);
//        //        }
//        //    }
//        //    return list == null ? null : list.ToArray();
//        //}


//        //#endregion
//    }
//}
